import lodash from 'lodash';
import {
    convertSecToMinAndSec,
    createAGroupFolder,
    getCurrentDate,
    getPlayerData,
    isGroupExist,
    isPlayerExist,
    readConfiguration,
    storagePlayerData,
    timestampToSeconds
} from '../function/function.js';

export class Bs extends plugin {
    constructor() {
        super({
            name: '[Bs]赌面包',
            dsc: '赌面包',
            event: 'message',
            priority: 1,
            rule: [
                { reg: /^[#\/]赌(.*)(剪刀|石头|布)$/, fnc: 'bet' }
            ]
        })
    }

    async bet(e) {
        // 非群无法游玩
        if (!e.isGroup) return e.reply(['该游戏只能在群内使用'])
        /** ID [群, 用户] */
        const ID = [e.group_id, e.user_id]
        /** 用户输入内容 */
        const [, USER_INPUT_CONTENT, GESTURE] = e.msg.match(/^[#\/]赌(.*)(剪刀|石头|布)$/)
        /** 配置数据 */
        const configData = await readConfiguration()
        /** 默认物品 */
        let defaultItem = configData['bread_thing']
        /** 自定义物品 */
        const CUSTOM_ITEMS = configData['special_thing_group'][ID[0]]

        // 判断执行条件 [不存在自定义物品 同时 用户输入内容不为默认物品] 或者 [存在自定义物品 同时 用户输入内容不为自定义物品]
        if (!CUSTOM_ITEMS && USER_INPUT_CONTENT !== defaultItem || CUSTOM_ITEMS && USER_INPUT_CONTENT !== CUSTOM_ITEMS) return false
        // 存在自定义物品 默认物品修改为自定义物品
        if (CUSTOM_ITEMS) {
            defaultItem = CUSTOM_ITEMS
        }

        // 判断是否有此群文件夹，没有则创建
        if (!isGroupExist(ID[0])) { createAGroupFolder(ID[0]) }

        // 判断是否存在该用户，没有则创建基础信息
        if (!isPlayerExist(ID[0], ID[1])) {
            storagePlayerData(ID[0], ID[1], {
                name: e.sender.card || '未设置面包昵称',
                lv: 0,
                xp: 0,
                number: 0,
                cd: { buy: 0, eat: 0, rob: 0, give: 0, bet: 0 },
                log: { buy: [], eat: [], rob: [], give: [], bet: [] }
            })
        }

        /** 用户数据 */
        const USER_DATA = await getPlayerData(ID[0], ID[1])
        /** 用户面包数量 */
        const USER_NUMBER = USER_DATA['number']
        /** 当前秒 */
        const CURRENT_SECOND = timestampToSeconds(Date.now())
        /** 剩余CD */
        const REMAINING_TIME = CURRENT_SECOND - USER_DATA['cd']['bet']

        // 若剩余CD为负数，则CD还未结束，返回提示
        if (REMAINING_TIME < 0) {
            const { minutes, remainingSeconds } = convertSecToMinAndSec(Math.abs(REMAINING_TIME))
            if (minutes > 0) {
                return e.reply([`无法赌${defaultItem}，还有${minutes}分${remainingSeconds}秒`])
            } else {
                return e.reply([`无法赌${defaultItem}，还有${remainingSeconds}秒`])
            }
        }

        /** 赌到的面包数量 */
        let betNumber = lodash.random(configData['min_bet'], configData['max_bet'])
        // 判断面包是否足够
        if (USER_NUMBER < betNumber) return e.reply([`你的${defaultItem}还不够赌，来买一些吧`])

        /** 返回消息 */
        let msg

        /** 系统随机手势 */
        const RANDOM_GESTURE = ["剪刀", "石头", "布"][lodash.random(0, 2)];

        /** 对局状态 */
        let type

        // 判断输赢
        if (
            GESTURE === '剪刀' && RANDOM_GESTURE === '布' ||
            GESTURE === '石头' && RANDOM_GESTURE === '剪刀' ||
            GESTURE === '布' && RANDOM_GESTURE === '石头'
        ) { // 赢
            type = '赢&输'; msg = `${RANDOM_GESTURE}! 呜呜，我输了，给你${betNumber}个${defaultItem}！你现在拥有${USER_NUMBER + betNumber}个${defaultItem}！`
        } else if (
            RANDOM_GESTURE === '剪刀' && GESTURE === '布' ||
            RANDOM_GESTURE === '石头' && GESTURE === '剪刀' ||
            RANDOM_GESTURE === '布' && GESTURE === '石头'
        ) { // 输
            type = '输&输'; betNumber = -betNumber
            msg = `${RANDOM_GESTURE}!嘿嘿，我赢啦！你的${Math.abs(betNumber)}个${defaultItem}归我了！你现在拥有${USER_NUMBER + betNumber}个${defaultItem}！`
        } else { // 平局
            type = '平局'; msg = `${RANDOM_GESTURE}!平局啦！${defaultItem}都还给你啦！还可以再来一次！`
            configData['cd_bet'] = 0
            betNumber = 0
        }

        /** 1~0 之间的随机数 */
        const RANDOM_NUMBER = Math.random();
        /** 随机事件 */
        if (RANDOM_NUMBER < 0.04) {
            /** [1, 2] 之间的随机数 */
            const RANDOM = lodash.random(1, 2)
            if (RANDOM === 1) {
                if (USER_NUMBER > betNumber * 2 && type === '赢&输') {
                    msg = '加大面包量！' + msg
                    betNumber *= 2
                } else {
                    msg = `我出三只手！石头剪刀布！你输啦！给我${betNumber}个${defaultItem}！`
                }
            }
        } else if (RANDOM_NUMBER < 0.07) {
            msg = `你赌${defaultItem}被警察抓住了！你不赌，我不赌，和谐幸福跟我走！下次赌${defaultItem}时间多等40分钟！`
            betNumber = 0
            configData['cd_bet'] += 2400
        } else if (RANDOM_NUMBER < 0.1) {
            msg += `有点上瘾，你想再来一把！`
            configData['cd_bet'] = 0
        }

        // 用户数据处理 & 存储
        USER_DATA['cd']['bet'] = CURRENT_SECOND + configData['cd_bet']
        USER_DATA['log']['bet'].push(`[${getCurrentDate()}] 赌${defaultItem}获得了${betNumber}个${defaultItem}`)
        USER_DATA['number'] += betNumber
        storagePlayerData(ID[0], ID[1], USER_DATA)

        // 返回赌面包结果
        return e.reply([msg])
    }
}